package fgin

import (
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	glogger "gorm.io/gorm/logger"
)

var fdbMap = make(map[string]*gorm.DB)

func initGorm() {
	if len(fginConfig.Mysql) == 0 {
		// 没有填写mysql配置则不进行初始化
		return
	}
	var newGormLog glogger.Interface
	if fginConfig.GormLog != (GormLog{}) {
		// 配置文件如果没有gorm log的配置，则配置为空
		newGormLog = initGormLog()
	}

	for _, v := range fginConfig.Mysql {
		dsn := v.Target
		db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
			Logger:                 newGormLog,
			SkipDefaultTransaction: v.SkipDefaultTran,
			PrepareStmt:            v.PrepareStmt,
		})
		if err != nil {
			panic("mysql初始化失败: " + err.Error())
		}
		if v.MaxIdle > 0 && v.MaxOpen > 0 && v.MaxLift > 0 {
			// 构建连接池
			// 获取通用数据库对象 sql.DB ，然后使用其提供的功能
			sqlDB, err := db.DB()
			if err != nil {
				panic("mysql连接池失败: " + err.Error())
			}
			// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。
			sqlDB.SetMaxIdleConns(v.MaxIdle)
			// SetMaxOpenConns 设置打开数据库连接的最大数量。
			sqlDB.SetMaxOpenConns(v.MaxOpen)
			// SetConnMaxLifetime 设置了连接可复用的最大时间。
			sqlDB.SetConnMaxLifetime(time.Millisecond * time.Duration(v.MaxLift))
		}
		fdbMap[v.Name] = db
	}
}

func initGormLog() glogger.Interface {
	// 初始化gorm的日志输出
	return glogger.New(
		&fginGormLog{},
		// log.New(os.Stdout, "\r\n", log.LstdFlags),
		glogger.Config{
			SlowThreshold:             time.Duration(fginConfig.GormLog.SlowThreshold) * time.Millisecond,
			LogLevel:                  glogger.LogLevel(fginConfig.GormLog.LogLevel),
			IgnoreRecordNotFoundError: fginConfig.GormLog.IgnoreRecordNotFoundError,
			ParameterizedQueries:      fginConfig.GormLog.ParameterizedQueries,
			Colorful:                  fginConfig.GormLog.Colorful,
		},
	)
}

type fginGormLog struct{}

func (fgLog *fginGormLog) Printf(msg string, data ...any) {
	sqlStr := fmt.Sprintf(msg, data...)
	if fginConfig.GormLog.LogLevel <= 2 {
		logSuger.Error(sqlStr)
	} else if fginConfig.GormLog.LogLevel == 3 {
		logSuger.Warn(sqlStr)
	} else if fginConfig.GormLog.LogLevel == 4 {
		logSuger.Info(sqlStr)
	}
}
